/**
 * 执行exe文件
 */
import { execSync } from 'child_process';
import compressing from "compressing";
import fs from "fs"


let ex = {
    ".exe":exe,
    ".msi":exe,
    ".zip":zip
}

export default function perform(path:any,callback?:any){
    Object.keys(ex).some(e=>{
        if(path.endsWith(e)){
            ex[e](path,callback || ((err:any)=>{
                if(err){console.log(err)}
            }))
        }
    })
}

    
function exe(path:string,callback:any){
    // 把命令写入到文件
    console.log("开始执行安装")
    try{
        // 开始执行这个文件
        execSync(path)
    }catch(err){
        if(fs.existsSync(path)){
            callback || callback("安装失败，exe文件可能损坏")
        }else{
            callback || callback("安装失败，可能被杀毒软件删除")
        }
    }
}

async function zip(path:string,call?:Function){
    console.log("开始执行解压");
    await compressing.zip.uncompress(path,path.replace(/\.[^./\\]*$/,""))
    console.log("解压完成");
    //检查里面的exe文件
    detectionDir(path.replace(/\.[^./\\]*$/,""),(err:any)=>{
        call(err)
        if(!err){
            // 删除源文件文件
            console.log("删除压缩包");
            fs.unlinkSync(path)
        }else{
            console.log(err)
        }
    })
}


function detectionDir(path:string,callback:Function){
    let dir = fs.readdirSync(path)
    if(dir.length === 1){
        if(fs.statSync(path+ "\\" +dir[0]).isFile){
            // 这是一个文件执行
            perform(dir[0],callback)
        }else{
            detectionDir(dir[0],callback)
        }
    }else{
        // 把exe过滤出来
        dir = dir.filter(e=>e.endsWith(".exe"))
        if(dir.length===1){
            exe(dir[0],callback)
        }else{
            console.log("exe文件太多，请手动安装或使用")
        }
    }
}